// utils/request.ts

import axios, { 
  AxiosInstance, 
  AxiosRequestConfig, 
  AxiosResponse, 
  AxiosError,
  InternalAxiosRequestConfig 
} from 'axios';
import { message } from 'antd';

// 1. 定义响应数据的接口
interface ResponseData<T = any> {
  code: number;
  message: string;
  data: T;
}

// 2. 创建 axios 实例
const request: AxiosInstance = axios.create({
  baseURL: import.meta.env.VITE_API_BASE_URL || '/api/v1', // 容器内通过 Nginx 反代；本地可设 VITE_API_BASE_URL
  timeout: 10000, // 请求超时时间
  headers: {
    'Content-Type': 'application/json',
  },
});

// 3. 请求拦截器
request.interceptors.request.use(
  (config: InternalAxiosRequestConfig) => {
    // 在发送请求之前做些什么
    // 可以在这里添加一些通用的请求头或其他配置
    return config;
  },
  (error: AxiosError) => {
    // 对请求错误做些什么
    message.error('请求发送失败');
    return Promise.reject(error);
  }
);

// 4. 响应拦截器
request.interceptors.response.use(
  (response: AxiosResponse<ResponseData>) => {
    // 对响应数据做点什么
    const { code, message: msg, data } = response.data;

    // 根据后端约定的 code 处理业务逻辑
    if (code === 200) {
      // 成功时显示成功提示（可选）
      if (msg && msg !== 'success') {
        message.success(msg);
      }
      return data; // 只返回业务数据
    } else {
      // 可以在这里统一处理错误，例如弹出提示
      console.error('业务错误:', msg);
      message.error(msg || '操作失败');
      return Promise.reject(new Error(msg));
    }
  },
  (error: AxiosError) => {
    // 对响应错误做点什么
    let errorMsg = '请求失败';
    if (error.response) {
      // 服务器响应了状态码，但不是 2xx
      switch (error.response.status) {
        case 403:
          errorMsg = '拒绝访问';
          break;
        case 404:
          errorMsg = '请求地址出错';
          break;
        case 500:
          errorMsg = '服务器内部错误';
          break;
        default:
          errorMsg = (error.response.data as any)?.message || error.message;
      }
    } else if (error.request) {
      // 请求已发出，但没有收到响应
      errorMsg = '网络连接错误';
    } else {
      // 在设置请求时发生了一些错误
      errorMsg = error.message;
    }

    console.error('请求错误:', errorMsg);
    message.error(errorMsg);
    return Promise.reject(new Error(errorMsg));
  }
);

// 5. 导出封装的请求方法
export default {
  get<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return request.get(url, config);
  },
  post<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return request.post(url, data, config);
  },
  put<T = any>(url: string, data?: any, config?: AxiosRequestConfig): Promise<T> {
    return request.put(url, data, config);
  },
  delete<T = any>(url: string, config?: AxiosRequestConfig): Promise<T> {
    return request.delete(url, config);
  },
  // 可以根据需要添加其他方法
};